Quaternion이란?
안녕하세요. 이번 포스트에서 Quaternion에 대한 내용을 정리해보려고 합니다.
Unity에서는 오브젝트의 회전 값을 쿼터니언으로 표현하고 있습니다.
상세한 내용은 Unity API 문서를 참고하시길 바랍니다.
쿼터니언을 사용하는 이유는 Euler의 단점을 개선하기 위해서인데요.
Euler는 무엇일까요?
Euler(오일러)
Euler란 3차원 공간의 절대 좌표를 기준으로 물체의 회전을 측정하는 방식입니다.
회전이 일어날 경우 세 축으로 나누어서 계산이 이루어집니다.
180도가 넘는 회전을 표현할 수 있습니다.
그 과정에서 짐벌락이라는 문제점이 발생할 수 있습니다.
짐벌락
짐벌락이란 3개의 축이 순차적으로 회전하는 도중 2개의 축이 겹치는 현상을 뜻합니다.
오일러는 x, y, z 축을 기준으로 순차적 회전이 이루어집니다.
위의 그림에서는 x축 기준으로 회전이 발생하더니 z축과 겹쳐진 것을 확인할 수 있습니다.
이렇게 두개의 축이 겹쳐지면 y축이 회전할 경우 z축 기준 회전 값이 달라지게 됩니다.
Quaternion
Quaternion은 이러한 오일러의 짐벌락 현상을 해결하기 위해 사용됩니다.
Unity에서 오브젝트의 회전 상태를 나타내는 방식이며 (x, y, z, w)로 표현이 가능합니다.
각각의 인수는 특정 벡터 (x, y, z)와 벡터의 회전값인 스칼라(w)의 정보를 담고 있습니다.
Quaternion을 이용한 회전은 다른 축과 관계되어 측정되므로 180도 이상의 회전은 표현이 불가능합니다.
Quaternion 관련 메소드
앞에서 Quaternion의 개념에 대해 알아보았으니,
Quaternion을 어떻게 활용할 수 있는지 그와 관련된 메소드들을 알아보도록 하겠습니다.
Quaternion.identity
Quaternion.identity는
오브젝트가 최상위 오브젝트일 경우 월드 좌표 기준 회전이 발생하지 않은 기본 값,
오브젝트가 자식 오브젝트일 경우 부모 좌표 기준 회전이 발생하지 않는 기본 값을 담고 있습니다.
1 | transform.position = Quaternion.identity; |
Quaternion.eulerAngles
정의: public Vector3 eulerAngles
eulerAngles는 쿼터니언을 오일러로 나타내줍니다.
원래 오브젝트의 rotation 값은 Quaternion으로 정의 되어있기 때문에 오일러각을 이용하여 값을 수정하는 것이 불가합니다.
하지만 Quaternion.eulerAngles를 통해 오일러 값을 이용하여 회전 시키는 것이 가능합니다.
1 | Vector3 _curEulerAngles; |
Quaternion.Euler
정의: public static Quaternion Euler(float x, float y, float z)
오일러 회전 값을 받아 쿼터니언 회전 값으로 리턴해줍니다.
1 | private Vector3 _rotVector; |
Quaternion.FromToRotaion
정의: public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection)
fromDirection에 입력된 벡터를 하나의 축으로 삼아 toDirection의 벡터 축으로 회전시켜줍니다.
1 | private void Start(){ |
Quaternion.LookRotaion
정의: public static Quaternion LookRotation(Vector3 forward, Vector3 upwards = Vector3.up)
forward는 바라보고 싶은 방향이고, upwards는 오브젝트의 머리가 향하는 방향입니다.
1 | private Transform = _otherObject; |
위와 같이 작성하게 되면 _relativeDir는 상대오브젝트의 좌표에서 현 오브젝트의 좌표를 빼주었으므로
현 오브젝트 -> 상대 오브젝트 벡터를 뜻합니다.
해당 벡터 방향을 바라보면서 현 오브젝트의 머리는 위를 바라볼 수 있도록 작성해준 것입니다.
Quaternion.RotateTowards
정의: public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta)
from 회전값을, to 회전값까지 maxDegressDelta 만큼 회전시킨 회전 결과값을 Quanternion으로 리턴해줍니다.
1 | void Update(){ |
이번 포스터는 여기까지 작성하고 마치겠습니다.